home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
MCASM.RAR
/
MC_ASM.EXE
/
WROX_ASM
/
CH12
/
EFFECTS
/
SCREFF.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1994-11-14
|
10KB
|
470 lines
#include <mem.h>
#include <dos.h>
#include <stdlib.h>
#include "common.h"
#include "graph.h"
#include "screff.h"
pointtype arrp[32*20*7];
unsigned char arrhits[32*20*7];
void showbuffer(int x1,int y1,int x2,int y2,void *p1,void *v)
{
int i;
for(i=y1;i<=y2;i++)
memcpy(&MixBuffer(v)[i][x1],&MixBuffer(p1)[i][x1],x2-x1+1);
}
void BadFAX(int x1,int y1,int x2,int y2,
int delta,int uord,void *p1,void *v)
{
int sx,i,j;
sx = x2-x1+1;
if (uord == 1)
{
for(i=y2;i>=y1+delta;i--)
{
memcpy(&MixBuffer(v)[i-delta][x1],
&MixBuffer(p1)[i][x1],sx);
for(j=0;j<=delta-1;j++)
memcpy(&MixBuffer(v)[i-delta+j+1][x1],
&MixBuffer(v)[i-delta+j][x1],sx);
delay(5);
}
for(i=y1+delta-1;i>=y1;i--)
{
memcpy(&MixBuffer(v)[y1][x1],
&MixBuffer(p1)[i][x1],sx);
for(j=0;j<=i-y1;j++)
memcpy(&MixBuffer(v)[y1+j][x1],
&MixBuffer(v)[y1][x1],sx);
delay(5);
}
}
else
{
for(i=y1;i<=y2-delta;i++)
{
memcpy(&MixBuffer(v)[i+delta][x1],
&MixBuffer(p1)[i][x1],sx);
for(j=0;j<=delta-1;j++)
memcpy(&MixBuffer(v)[i+delta-j-1][x1],
&MixBuffer(v)[i+delta-j][x1],sx);
delay(5);
}
for(i=y2-delta+1;i<=y2;i++)
{
memcpy(&MixBuffer(v)[y2][x1],
&MixBuffer(p1)[i][x1],sx);
for(j=0;j<=y2-i;j++)
memcpy(&MixBuffer(v)[y2-j][x1],
&MixBuffer(v)[y2][x1],sx);
delay(5);
}
}
}
void ShowFromCorner(int x1,int y1,int x2,int y2,
int s,int coner,void *p1,void *v)
{
int i,j,dx,dy;
dx = (x2-x1+1)/s;
dy = (y2-y1+1)/s;
switch (coner) {
case 0 : //expand form upper left coner
for(i=1;i<=s;i++)
{
for(j=0;j<=i*dy+dy;j++)
memcpy(&MixBuffer(v)[y1+j][x1],
&MixBuffer(p1)[y1+j][x1],i*dx);
delay(10);
} break;
case 1 : //expand form upper right coner
for(i=1;i<=s;i++)
{
for(j=0;j<=i*dy+dy;j++)
memcpy(&MixBuffer(v)[y1+j][x2-i*dx+1],
&MixBuffer(p1)[y1+j][x2-i*dx+1],i*dx);
delay(10);
} break;
case 2 : //expand form bottom right coner
for(i=1;i<=s;i++)
{
for(j=0;j<=i*dy+dy;j++)
memcpy(&MixBuffer(v)[y2-j][x2-i*dx+1],
&MixBuffer(p1)[y2-j][x2-i*dx+1],i*dx);
delay(10);
} break;
case 3 : //expand form bottom left coner
for(i=1;i<=s;i++)
{
for(j=0;j<=i*dy+dy;j++)
memcpy(&MixBuffer(v)[y2-j][x1],
&MixBuffer(p1)[y2-j][x1],i*dx);
delay(10);
} break;
}
showbuffer(x1,y1,x2,y2,p1,v);
}
void RandomFillArea(int x1,int y1,int x2,int y2,
int dx,int dy,void *p1,void *v)
{
int counter,i,j,sx,sy;
counter = 0;
sx=(x2-x1)/dx + 1;
sy=(y2-y1)/dy + 1;
for(j=1;j<=sy*sx;j++) arrhits[j] = 0;
for(i=0;i<=sy-1;i++)
for(j=1;j<=sx;j++)
{
arrp[i*sx+j].x=x1+j*dx-dx;
arrp[i*sx+j].y=y1+(i+1)*dy-dy;
}
do
{
do
{
j = random(sy*sx);
if (j == 0) continue;
if (arrhits[j] == 0) {arrhits[j] = 1; break;} else continue;
} while (0 > -1);
counter++;
if (((x2 - arrp[j].x) < dx) && ((y2 - arrp[j].y) < dy))
for(i=0;i<=y2 - arrp[j].y;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],
x2 - arrp[j].x+1);
else
if ((x2 - arrp[j].x) < dx)
for(i=0;i<=dy-1;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],
x2 - arrp[j].x+1);
else
if ((y2 - arrp[j].y) < dy)
for(i=0;i<=y2 - arrp[j].y;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],dx);
else
for(i=0;i<=dy-1;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],dx);
if (counter > sx*sy-5)
{
for(j=1;j<=sy*sx;j++)
if (arrhits[j] == 0)
if (((x2 - arrp[j].x) < dx) && ((y2 - arrp[j].y) < dy))
for(i=0;i<=y2 - arrp[j].y;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],
x2 - arrp[j].x+1);
else
if ((x2 - arrp[j].x) < dx)
for(i=0;i<=dy-1;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],
x2 - arrp[j].x+1);
else
if ((y2 - arrp[j].y) < dy)
for(i=0;i<=y2 - arrp[j].y;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],dx);
else
for(i=0;i<=dy-1;i++)
memcpy(&MixBuffer(v)[arrp[j].y+i][arrp[j].x],
&MixBuffer(p1)[arrp[j].y+i][arrp[j].x],dx);
break;
}
delay(1);
} while (0 > -1);
}
void Explode(int x1,int y1,int x2,int y2,void *p1,void *v)
{
int cx,cy,i,j,k;
cx = (x2 - x1 + 1)/2;
cy = (y2 - y1 + 1)/2;
i=j=1;
do
{
if (i < cx)
{
if (j == cy)
{
showbuffer(x1,y1,x2,y2,p1,v);
i=cx;
}
else
{
for(k=y1;k<=y2;k++)
memcpy(&MixBuffer(v)[k][cx-i],
&MixBuffer(p1)[k][cx-i],i*2);
i++;
}
}
if (j < cy)
{
if (i == cx)
{
showbuffer(x1,y1,x2,y2,p1,v);
j = cy;
}
else
{
for(k=y1;k<=2*j+y1;k++)
memcpy(&MixBuffer(v)[cy-j+k][x1],
&MixBuffer(p1)[cy-j+k][x1],x2-x1+1);
j++;
}
}
} while (!((i == cx) && (j == cy)));
}
void Slide(int x1,int y1,int x2,int y2,
int step,int ulrd,void *p1,void *v)
{
int dx,i,j;
dx = x2 - x1 + 1;
switch (ulrd) {
case 0 : //up to down
{
for(i=0;i<=(y2-y1+1)/step-1;i++)
for(j=0;j<=i*step;j++)
memcpy(&MixBuffer(v)[j+y1][x1],
&MixBuffer(p1)[y2-i*step+j][x1],dx);
for(j=y1;j<=y2;j++)
memcpy(&MixBuffer(v)[j][x1],
&MixBuffer(p1)[j][x1],dx);
} break;
case 1 : //down to up
{
for(i=y1;i<=y2/step;i++)
for(j=y1;j<=i*step + y1;j++)
memcpy(&MixBuffer(v)[y2-i*step+j][x1],
&MixBuffer(p1)[j][x1],x2-x1+1);
for(j=y2;j>=y1;j--)
memcpy(&MixBuffer(v)[j][x1],
&MixBuffer(p1)[j][x1],x2-x1+1);
} break;
case 2 : //right to left
{
for(i=1;i<=dx/step;i++)
for(j=y1;j<=y2;j++)
memcpy(&MixBuffer(v)[j][x1+dx-i*step],
&MixBuffer(p1)[j][x1],i*step);
showbuffer(x1,y1,x2,y2,p1,v);
} break;
case 3 : //left to right
{
for(i=1;i<=dx/step;i++)
for(j=y1;j<=y2;j++)
memcpy(&MixBuffer(v)[j][x1],
&MixBuffer(p1)[j][x1+dx-i*step],i*step);
showbuffer(x1,y1,x2,y2,p1,v);
}
}
}
//if direct = 0 then y2-y1 must be even
//and if direct = 1 then x2-x1 must be even
void ShowFromCenter(int x1,int y1,int x2,int y2,
int direct,void *p1,void *v)
{
int dx,dy,dy2,i,j;
if (direct == 0)
{
dx=x2-x1+1;
dy=y2-y1+1;
dy2=dy/2 + y1;
for(i=0;i<=dy2 - y1 - 1;i++)
{
memcpy(&MixBuffer(v)[dy2-i][x1],
&MixBuffer(p1)[dy2-i][x1],dx);
memcpy(&MixBuffer(v)[dy2+i][x1],
&MixBuffer(p1)[dy2+i][x1],dx);
delay(4);
}
}
else
{
dx = (x2-x1+1)/2 + x1;
for(i=0;i<=dx - x1 - 1;i++)
{
for(j=y1;j<=y2;j++)
memcpy(&MixBuffer(v)[j][dx-i],
&MixBuffer(p1)[j][dx-i],i*2+1);
delay(1);
}
}
showbuffer(x1,y1,x2,y2,p1,v);
}
void ShowToCenter(int x1,int y1,int x2,int y2,
int direct,void *p1,void *v)
{
int dx,dy,i,j;
dx=x2-x1+1;
dy=(y2-y1+1)/2;
if (direct == 0)
for(i=0;i<=dy;i++)
{
memcpy(&MixBuffer(v)[y1+i][x1],
&MixBuffer(p1)[y1+i][x1],dx);
memcpy(&MixBuffer(v)[y2-i][x1],
&MixBuffer(p1)[y2-i][x1],dx);
delay(5);
}
else
{
dx = (x2-x1+1)/2;
for(i=0;i<=dx;i++)
for(j=y1;j<=y2;j++)
{
memcpy(&MixBuffer(v)[j][x1],
&MixBuffer(p1)[j][x1],i+1);
memcpy(&MixBuffer(v)[j][x2-i],
&MixBuffer(p1)[j][x2-i],i+1);
}
}
}
void Jalousie(int x1,int y1,int x2,int y2,int step,
int direct,void *p1,void *v)
{
int dx,dy2,dy,i,j;
dx = (x2 - x1 + 1);
dy = (y2 - y1 + 1);
dy2 = dy/step;
if (direct == 0)
{
for(i=y1;i<=step - 1 + y1;i++)
{
for(j=0;j<=dy2 - 1;j++)
memcpy(&MixBuffer(v)[i+j*step][x1],
&MixBuffer(p1)[i+j*step][x1],dx);
if (((dy % step) != 0) && ((i+j*step) <= y2))
memcpy(&MixBuffer(v)[i+j*step][x1],
&MixBuffer(p1)[i+j*step][x1],dx);
delay(10);
}
}
else
{
for(i=step-1+y1;i>=y1;i--)
{
for(j=dy2-1;j>=0;j--)
memcpy(&MixBuffer(v)[i+j*step][x1],
&MixBuffer(p1)[i+j*step][x1],dx);
if (((dy % step) != 0) && ((i+(j+1)*step) <= y2))
memcpy(&MixBuffer(v)[i+(j+1)*step][x1],
&MixBuffer(p1)[i+(j+1)*step][x1],dx);
delay(10);
}
}
}
void Develope(int x1,int y1,int x2,int y2,
int divisor,void *p1,void *v)
{
long l,dx,dy,i,j;
dx = x2 - x1 + 1;
dy = y2 - y1 + 1;
l = 0;
do
{
i=((l/dx) % dy) + y1;
j=(l % dx) + x1;
*&MixBuffer(v)[i][j] = *&MixBuffer(p1)[i][j];
l+=divisor;
} while (!((l/divisor) > (dx*dy)));
}
void Gone_with_the_wind(int x1,int y1,int x2,int y2,
void *p1,void *p2,void *v)
{
int count,l,k,i,j;
int arrx[200];
arrx[y1] = random(20);
for(i=y1+1;i<=y2;i++)
{
arrx[i] = arrx[i-1] + random(4)-2;
if (arrx[i] < 0) arrx[i] = 0;
}
for(i=y1;i<=y2;i++)
{
memcpy(&MixBuffer(v)[i][x1+arrx[i]],
&MixBuffer(p1)[i][x1],(x2-x1+1)-arrx[i]);
memcpy(&MixBuffer(v)[i][x1],
&MixBuffer(p2)[i][x1],arrx[i]);
}
do
{
k = 0;
for(i=y1;i<=y2;i++)
{
l = (int(random(32001)) - int(16000))/8000;
k+=l;
arrx[i]+=k+5;
if (arrx[i] < 0) arrx[i] = 0;
}
for(i=y1+1;i<=y2-1;i++)
{
arrx[i] = (arrx[i-1] +2*arrx[i]+ arrx[i+1])/4;
if (arrx[i] < 0) arrx[i] = 0;
}
count = 0;
for(i=y1;i<=y2;i++)
{
k = (x2-x1+1) - arrx[i];
if (k < 0) k = 0;
l = arrx[i];
if (l > (x2-x1)) {l = (x2-x1); count++;}
memcpy(&MixBuffer(v)[i][x1+l],
&MixBuffer(p1)[i][x1],k);
memcpy(&MixBuffer(v)[i][x1],
&MixBuffer(p2)[i][x1],l+1);
}
} while (!(count >= (y2-y1-1)));
}
void CenterExplode(int x1,int y1,int x2,int y2,int step,void *p1,void *p2,void *v)
{
int dx,dy,i,j;
dx = (x2-x1+1);
dy = (y2-y1+1)/2;
if (p2 == NULL)
{
for(i=0;i<=dy/step;i++)
for(j=0;j<=i*step;j++)
{
memcpy(&MixBuffer(v)[y1+j+dy-1][x1],
&MixBuffer(p1)[y2-i*step+j-1][x1],dx);
memcpy(&MixBuffer(v)[y1+dy-j][x1],
&MixBuffer(p1)[y1+i*step-j][x1],dx);
}
p2 = p1;
}
else
for(i=0;i<=dy/step;i++)
{
for(j=0;j<=dy-i*step-1;j++)
{
memcpy(&MixBuffer(v)[y1+j][x1],
&MixBuffer(p1)[y1+i*step+j][x1],dx);
memcpy(&MixBuffer(v)[y1+dy+i*step+j][x1],
&MixBuffer(p1)[y1+dy+j][x1],dx);
}
delay(10);
for(j=0;j<=i*step;j++)
{
memcpy(&MixBuffer(v)[y1+j+dy-1][x1],
&MixBuffer(p2)[y2-i*step+j][x1],dx);
memcpy(&MixBuffer(v)[y1+dy-j][x1],
&MixBuffer(p2)[y1+i*step-j][x1],dx);
}
}
showbuffer(x1,y1,x2,y2,p2,v);
}